Benvenuto in Il grande passaggio. Nella programmazione per CPU, definiamo come iterare; nel GPGPU, definiamo cosa sembra un'iterazione. Questo cambiamento dal modello basato su istruzioni a quello basato sui dati è alimentato dall' astrazione del kernel.
1. Il progetto __global__
Utilizzando il __global__ qualificatore, non stai scrivendo una funzione: stai progettando un progetto scalabile. Un'unica esecuzione del kernel rappresenta un'unità autonoma di lavoro, consentendo alla GPU di orchestrare migliaia di compiti identici su un numero elevatissimo di core senza gestione manuale dei thread.
2. Il risolutore di indirizzi globale
Come fa un singolo thread tra milioni a trovare il proprio obiettivo? Utilizza un contratto deterministico noto come formula di indicizzazione:
$$\text{threadID} = \text{blockIdx.x} \times \text{blockDim.x} + \text{threadIdx.x}$$
Questa formula agisce come un sistema di coordinate, collegando i dati logici del software (l'array) all'architettura fisica dell'hardware (blocchi e thread).
3. Configurazione dell'esecuzione
I parametri <<<B, T>>> definiscono la forma della griglia. Ciò garantisce Scalabilità trasparente: il tuo codice esegue la stessa logica indipendentemente dal fatto che l'hardware abbia 2 SM o 80 SM.